/*
批量CSV处理工具 - HTTP压力测试客户端
用于批量处理CSV文件中的用户数据，并发送HTTP请求获取Token
主要功能：
1. 读取CSV文件中的用户ID和应用用户ID
2. 并发发送HTTP请求到云天API获取用户Token
3. 将结果写入新的CSV文件中
*/
package main

import (
	"encoding/csv"
	"log"
	"net/http"
	"os"
	"sync"
)

// processBatch 处理一批CSV数据
// 参数：
//
//	batchData: 当前批次的CSV数据行
//	wg: 用于同步的WaitGroup
//	tokenWriter: CSV文件写入器
func processBatch(batchData [][]string, wg *sync.WaitGroup, tokenWriter *csv.Writer) {
	defer wg.Done()

	// 遍历当前批次的每一行数据
	for _, row := range batchData {
		// 检查数据行是否有足够的列
		if len(row) < 2 {
			continue
		}

		userID := row[0]    // 用户ID
		appUserID := row[1] // 应用用户ID

		// 发送 HTTP POST 请求到云天API获取用户Token
		resp, err := http.Post("https://gz-api-bnd.yuntiancloud.com:18113/v1/servo/usertoken", "application/json", nil)
		if err != nil {
			log.Printf("Error sending HTTP request: %v", err)
			continue
		}
		defer resp.Body.Close()

		// 检查HTTP响应状态码
		if resp.StatusCode != http.StatusOK {
			log.Printf("HTTP request failed with status code: %d", resp.StatusCode)
			continue
		}

		// 处理响应数据
		// 这里假设响应数据中有 userid 和 token 字段
		// 实际应用中需要解析JSON响应获取真实的UUID和Token
		uuid := "uuid_value"   // 实际应从响应JSON中获取
		token := "token_value" // 实际应从响应JSON中获取

		// 将结果写入输出CSV文件
		// 格式：userID, appUserID, uuid, token
		tokenWriter.Write([]string{userID, appUserID, uuid, token})
	}
}

// main 主函数 - 程序入口点
func main() {
	// 打开输入CSV文件
	inputFile, err := os.Open("output1111.csv")
	if err != nil {
		log.Fatalf("Error opening input file: %v", err)
	}
	defer inputFile.Close()

	// 创建CSV读取器并读取所有记录
	reader := csv.NewReader(inputFile)
	records, err := reader.ReadAll()
	if err != nil {
		log.Fatalf("Error reading CSV file: %v", err)
	}

	// 创建输出CSV文件
	outputFile, err := os.Create("user_token.csv")
	if err != nil {
		log.Fatalf("Error creating output file: %v", err)
	}
	defer outputFile.Close()

	// 创建CSV写入器
	tokenWriter := csv.NewWriter(outputFile)
	defer tokenWriter.Flush()

	// 并发处理数据 - 按批次分组处理提高效率
	var wg sync.WaitGroup
	batchSize := 100 // 每批处理100行数据

	// 分批处理所有记录
	for i := 0; i < len(records); i += batchSize {
		end := i + batchSize
		if end > len(records) {
			end = len(records)
		}
		batchData := records[i:end] // 获取当前批次的数据

		// 启动新的goroutine处理当前批次
		wg.Add(1)
		go processBatch(batchData, &wg, tokenWriter)
	}

	// 等待所有goroutine完成
	wg.Wait()
	log.Println("Processing completed")
}
